package zhtt.demo01;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

/**
 * Created by mengxiaxia on 2017/4/26.
 */
/**
 * 定义自己的Interceptor最重要的是要实现plugin方法和intercept方法，在plugin方法中我们可以决定是否要进行拦截进而决定要返回一个什么样的目标对象。
 * 而intercept方法就是要进行拦截的时候要执行的方法。
 */
@Intercepts({@Signature(type= Executor.class,method = "update",
        args = {MappedStatement.class,Object.class})})
public class Interceptor01 implements Interceptor {

    /**
     * plugin方法是拦截器用于封装目标对象的，通过该方法我们可以返回目标对象本身，也可以返回一个它的代理。
     * 当返回的是代理的时候我们可以对其中的方法进行拦截来调用intercept方法，当然也可以调用其他方法，这点将在后文讲解。
     * @param invocation
     * @return
     * @throws Throwable
     */
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("\n--------intercept------->>拦截器");
        return invocation.proceed();
    }

    public Object plugin(Object target) {
        System.out.println("\n-------plugin-------->>拦截器");
        return Plugin.wrap(target, this);
    }

    /**
     * setProperties方法是用于在Mybatis配置文件中指定一些属性的。
     * */
    public void setProperties(Properties properties) {
        System.out.println("\n-------setProperties-------->>拦截器："+properties.get("someProperty"));
    }
}
